package com.jyhs.maven.util;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

public class ReflectUtil {

    /***
     * 将请求参数中的数据设置到对象属性中
     * @param req
     * @param object
     * @throws IllegalAccessException
     * @throws ParseException
     * @throws SQLException
     */
    public static void httpServletRequestToObject(HttpServletRequest req, Object object) throws IllegalAccessException, ParseException, SQLException {
        Class<?> targetClass = object.getClass();

        Field[] fields = targetClass.getDeclaredFields();
        for (Field field : fields) {

            //暴力反射
            field.setAccessible(true);
            String typeName = field.getType().getTypeName();

            if(null!= req.getParameter(field.getName()) && !"".equals(req.getParameter(field.getName())) ){
                if("java.lang.Long".equals(typeName)){
                    Long longValue= Long.valueOf(req.getParameter(field.getName()));
                    field.set(object,longValue);
                }else if("java.math.BigDecimal".equals(typeName)){
                    BigDecimal decimalValue= new BigDecimal(req.getParameter(field.getName()));
                    field.set(object,decimalValue);
                }
                else {
                    field.set(object, req.getParameter(field.getName()));
                }
            }
        }
    }

        /***
         * 将结果集ResultSet 的值设置到对象中
         * @param rs
         * @param object
         * @throws IllegalAccessException
         * @throws ParseException
         * @throws SQLException
         */
    public static void resultSetToObject(ResultSet rs, Object object) throws IllegalAccessException, ParseException, SQLException {
        Class<?> targetClass = object.getClass();

        Field[] fields = targetClass.getDeclaredFields();
        for (Field field : fields) {
            //暴力反射
            field.setAccessible(true);
            String typeName = field.getType().getTypeName();
            if(null!= rs.getObject(field.getName())){
                if("java.lang.Long".equals(typeName)){
                    Long longValue= Long.valueOf(rs.getObject(field.getName()).toString());
                    field.set(object,longValue);
                }else {
                    field.set(object, rs.getObject(field.getName()));
                }
            }
        }
    }

    public static void mapToObject(Map<String, String> map, Object object) throws IllegalAccessException, ParseException {
//        Class userClass = User.class;
        // 1.获取入口Class
        Class<?> targetClass = object.getClass();
        //2. 获取所有声明的属性（包括 公有、私有）
        Field[] fields = targetClass.getDeclaredFields();

        for (Field field : fields) {
            //暴力反射
            field.setAccessible(true);

            String typeName = field.getType().getTypeName();
            if(null!= map.get(field.getName())){

                // 设置值 之前 判断是否需要 转换数据类型
                if("java.lang.Long".equals(typeName)){
                    Long longValue= Long.valueOf(map.get(field.getName()));
                    // 3.给目标对象 设置值 set方法     第一个参数：  目标对象  第二参数： 设置的值
                    field.set(object,longValue);
                }else if("java.math.BigDecimal".equals(typeName)){
                    BigDecimal bigDecimal = new BigDecimal(map.get(field.getName()));
                    field.set(object,bigDecimal);
                }else if("java.util.Date".equals(typeName)){
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = formatter.parse(map.get(field.getName()));
                    field.set(object,date);
                }else{
                    //反射api，将map的值设置到对象中。
                    field.set(object, map.get(field.getName()));
                }
            }
        }
    }
}
